/**
 *
 * @param {array} position  查询的点的位置
 * @param {object} service {name,layerId} name是IG Server服务的名称,layerId是要素所在的图层
 * @param {callback} successCallback 成功之后的回调
 */
function queryPoint({ position, service, successCallback }) {
	//1、创建一个用于查询的点形状
	let pointObj = new Zondy.Object.Point2D(position[0], position[1]);
	//设置查询点的搜索半径
	pointObj.nearDis = 1;
	//2、初始化查询结构对象，设置查询结构包含几何信息
	var queryStruct = new Zondy.Service.QueryFeatureStruct();
	//是否包含几何图形信息
	queryStruct.IncludeGeometry = true;
	//是否包含图形显示参数
	queryStruct.IncludeWebGraphic = true;
	//3、指定查询规则
	var rule = new Zondy.Service.QueryFeatureRule({
		//是否将要素的可见性计算在内
		EnableDisplayCondition: false,
		//是否完全包含
		MustInside: false,
		//是否仅比较要素的外包矩形
		CompareRectOnly: false,
		//是否相交
		Intersect: true,
	});
	//4、实例化查询参数对象
	var queryParam = new Zondy.Service.QueryParameter({
		geometry: pointObj,
		resultFormat: 'json',
		struct: queryStruct,
		rule: rule,
	});
	//设置查询分页号
	queryParam.pageIndex = 0;
	//设置查询要素数目
	queryParam.recordNumber = 100;
	//5、实例化地图文档查询服务对象
	var queryService = new Zondy.Service.QueryDocFeature(
		queryParam,
		service.name,
		service.layerId,
		{
			ip: 'localhost',
			port: '6163', //访问IGServer的端口号，.net版为6163，Java版为8089
		}
	);
	//执行查询操作，querySuccess为查询回调函数
	queryService.query(successCallback);
}

class Query {
	constructor(options) {
		this.service = options.service;
		this.layerID = options.layerID;
		this.host = options.host || HOST;
		this.port = options.port || PORT;
	}

	/**
	 * 根据几何信息查询
	 * @param {ol.Feature.Geometry} geom : 用于查询的几何图形
	 * @param {function} querySuccess : 成功的回调
	 */
	queryByGeom(geom, querySuccess, type) {
		if (!querySuccess) {
			throw new Error('必须设置第二个参数(成功的回调)');
		}
		let geomObj; //注意let const在{}里面会形成块级作用域
		// 3.1 创建查询的几何图形
		if (type == 'Circle') {
			// 创建一个用于查询的圆
			geomObj = new Zondy.Object.Circle();
			// 将ol的几何图形转换成中地的几何图形
			geomObj.setByOL(geom);
		} else {
			// 创建一个用于查询的区
			geomObj = new Zondy.Object.Polygon();
			// 将ol的几何图形转换成中地的几何图形
			geomObj.setByOL(geom);
		}
		// 3.2 设置查询的结构
		const queryStruct = new Zondy.Service.QueryFeatureStruct({
			IncludeAttribute: true, // 需要包含属性信息
			IncludeGeometry: true, // 需要包含几何信息
			IncludeWebGraphic: true, // 需要包含样式信息
		});

		// 3.3 设置查询规则
		const rule = new Zondy.Service.QueryFeatureRule({
			//是否相交
			Intersect: true,
		});

		// 3.4 创建查询参数
		const queryParam = new Zondy.Service.QueryParameter({
			geometry: geomObj,
			struct: queryStruct,
			rule: rule,
			//显示查询到的要素数量
			cursorType: null,
		});
		//设置查询分页号
		queryParam.pageIndex = 0;
		//设置查询要素数目
		queryParam.recordNumber = 100;

		// 3.5 调用查询的接口
		const queryService = new Zondy.Service.QueryDocFeature(
			queryParam,
			this.service,
			this.layerID,
			{
				ip: this.host,
				port: this.port, //访问IGServer的端口号，.net版为6163，Java版为8089
			}
		);
		//执行查询操作，querySuccess为查询回调函数
		queryService.query(querySuccess);
	}

	/**
	 * 根据sql查询
	 * @param {string} sql : sql的where条件语句
	 * @param {function} querySuccess : 成功的回调
	 */
	queryBySQL(sql, querySuccess) {
		// 2.1 设置查询结构
		const queryStruct = new Zondy.Service.QueryFeatureStruct({
			IncludeAttribute: true, // 需要包含属性信息
			IncludeGeometry: true, // 需要包含几何信息
			IncludeWebGraphic: true, // 需要包含样式信息
		});
		// 2.2 设置查询参数, where条件
		const queryParam = new Zondy.Service.QueryParameter({
			struct: queryStruct,
			//显示查询到的要素数量
			cursorType: null,
		});
		queryParam.where = sql;
		// 2.3 调用查询接口
		const queryService = new Zondy.Service.QueryDocFeature(
			queryParam,
			this.service,
			this.layerID,
			{
				ip: this.host,
				port: this.port, //访问IGServer的端口号，.net版为6163，Java版为8089
			}
		);
		//执行查询操作，querySuccess为查询回调函数
		queryService.query(querySuccess);
	}

	/**
	 * 根据OID查询
	 * @param {string} fids : OID的值, 多个值使用,连接(中间不能写空格) eg '1,2'
	 * @param {function} querySuccess : 成功的回调
	 */
	queryByFID(fids, querySuccess) {
		// 2.1 设置查询结构
		const queryStruct = new Zondy.Service.QueryFeatureStruct({
			IncludeAttribute: true, // 需要包含属性信息
			IncludeGeometry: true, // 需要包含几何信息
			IncludeWebGraphic: true, // 需要包含样式信息
		});
		// 2.2 设置查询参数, where条件
		const queryParam = new Zondy.Service.QueryParameter({
			objectIds: fids,
			struct: queryStruct,
			//显示查询到的要素数量
			cursorType: null,
		});
		// 2.3 调用查询接口
		const queryService = new Zondy.Service.QueryDocFeature(
			queryParam,
			this.service,
			this.layerID,
			{
				ip: this.host,
				port: this.port, //访问IGServer的端口号，.net版为6163，Java版为8089
			}
		);
		//执行查询操作，querySuccess为查询回调函数
		queryService.query(querySuccess);
	}
}
export { queryPoint, Query };
